wayland: Create a cairo surface for the root window
authorRob Bradford <rob@linux.intel.com>
Wed, 24 Jul 2013 17:30:19 +0000 (18:30 +0100)
committerRob Bradford <rob@linux.intel.com>
Wed, 24 Jul 2013 17:30:19 +0000 (18:30 +0100)
Many parts of GTK+ assume that all windows have a cairo surface
assoicated with them. This change provides a logically 1x1 cairo surface
(respecting scale) for the root window.

https://bugzilla.gnome.org/show_bug.cgi?id=704554

gdk/wayland/gdkscreen-wayland.c
gdk/wayland/gdkwindow-wayland.c

index 862b2534518db6c14ce13e7f3d68b7437070cea4..81443835188cf0f21d478dec567d379a87ce4c9d 100644 (file)
@@ -805,12 +805,13 @@ _gdk_wayland_screen_new (GdkDisplay *display)
 
   screen_wayland->visual = gdk_wayland_visual_new (screen);
 
+  init_multihead (screen);
+
   screen_wayland->root_window =
     _gdk_wayland_screen_create_root_window (screen,
-                                           screen_wayland->width,
-                                           screen_wayland->height);
+                                            screen_wayland->width,
+                                            screen_wayland->height);
 
-  init_multihead (screen);
   init_settings (screen);
 
   return screen;
index f4db8daa30cbfce25c0b4dc901f393dcccb19e99..acb29e3f7f930e30c820c5ea3ac5404063bd80ea 100644 (file)
@@ -237,6 +237,20 @@ _gdk_wayland_screen_create_root_window (GdkScreen *screen,
   impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
 
   impl->wrapper = GDK_WINDOW (window);
+  if (gdk_screen_get_n_monitors(screen) > 0)
+    impl->scale = gdk_screen_get_monitor_scale_factor (screen, 0);
+  else
+    impl->scale = 1;
+
+  /* logical 1x1 fake buffer */
+  impl->cairo_surface =
+          cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+                                      impl->scale,
+                                      impl->scale);
+
+#ifdef HAVE_CAIRO_SURFACE_SET_DEVICE_SCALE
+  cairo_surface_set_device_scale (impl->cairo_surface, impl->scale, impl->scale);
+#endif
 
   window->window_type = GDK_WINDOW_ROOT;
   window->depth = 32;